# !/usr/bin/env python3
# -*- coding: utf-8 -*-

'此模块负责接收原始数据并构建数据库'

import pandas as pd

from trunk.cell import divide, simplify


class Vessel(object):
    """数据构建和分发类

    用来解析map数据结构并生成可用数据，生成的数据基于pandas

    Attributes:
        data_origin：map对象，原始数据，经由Root包生成
        __data_core: pandas.DataFrame对象，核心数据，由map数据结构转换获得
        __data_iteration_1: pandas.DataFrame对象，由核心数据衍生而来
        __data_iteration_2: pandas.DataFrame对象，由核心数据衍生而来
        __data_raw: pandas.DataFrame对象，核心数据与衍生数据合并而来
    """

    def __init__(self, data_origin) -> None:
        """类初始化"""
        self.__data_core = self.__structure(data_origin)
        self.__data_iteration_1 = self.__iterate_units()
        self.__data_iteration_2 = self.__iterate_dates()
        self.__data_raw = self.__conbine()

    def __structure(self, data_origin) -> pd.DataFrame:
        """生成核心数据

        将map转换为pandas.DataFrame对象，此数据为核心数据，便于以此基础进行衍生

        Args:
            data_origin：map对象格式

        Returns:
            pd.DataFrame对象

            形式如下:
                dates   units   issues  sources traceables
            0       x       x       x       x       x
            1       x       x       x       x       x
            ……      x       x       x       x       x
            n       x       x       x       x       x

        Raises:
            None
        """
        return pd.DataFrame(data_origin)

    def __iterate_units(self) -> pd.DataFrame:
        """衍生数据

        由核心数据衍生而来，由units列数据衍生为projects, individuals, units列
        通过./rule/category.xml文件中的编码信息，将单位工程编码衍生为项目工程、单项工程和单位工程对应的中文名称

        Args:
            None

        Returns:
            pd.DataFrame

            形式如下:
                projects   individuals   units
            0      x            x          x
            1      x            x          x
            ……     x            x          x
            n      x            x          x

        Raises:
            None
        """
        output = self.__data_core['units'].apply(divide)
        output.columns = ['projects', 'individuals', 'units']
        return output

    def __iterate_dates(self) -> pd.DataFrame:
        """衍生数据

        由核心数据衍生而来，由dates列数据衍生为ym列
        仅包含年份和月份

        Args:
            None

        Returns:
            pd.DataFrame

            形式如下:
                ym
            0    x
            1    x
            ……   x
            n    x

        Raises:
            None
        """
        output = self.__data_core['dates'].apply(simplify)
        output.columns = ['ym']
        return output

    def __conbine(self) -> pd.DataFrame:
        """组合数据

        将核心数据和衍生数据进行选择性组合

        Args:
            None

        Returns:
            pd.DataFrame

            形式如下:
                dates   issues  sources traceables  projects individuals  units  ym  # noqa E501
            0       x       x       x       x           x         x         x     x
            1       x       x       x       x           x         x         x     x
            ……      x       x       x       x           x         x         x     x
            n       x       x       x       x           x         x         x     x

        Raises:
            None
        """
        return pd.concat([
                self.__data_core.loc[:, ['dates', 'issues', 'sources', 'traceables']], # noqa E501
                self.__data_iteration_1,
                self.__data_iteration_2
            ],
            axis=1
        )

    @property
    def data_raw(self) -> pd.DataFrame:
        """对外只读属性接口"""
        return self.__data_raw
